﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;
using Iudicium.Servicios;

/// <summary>
/// Descripción breve de TransaccionCRN
/// </summary>
namespace Iudicium.Transacciones.CRN
{
    public class TransaccionCRN
    {
        private static readonly ILog log = LogManager.GetLogger("LogFile");

        public TransaccionCRN()
        {
            //
            // TODO: Agregar aquí la lógica del constructor
            //
        }

        public static int InsertTransaccion(Transaccion objTransaccion)
        {
            if (objTransaccion == null)
            {
                throw new ArgumentException("la Transaccion no puede ser nula.");
            }
            if (objTransaccion.ServicioId <= 0)
            {
                throw new ArgumentException("el servicioid no puede ser menor o igual a cero");
            }
            if (string.IsNullOrEmpty(objTransaccion.TipoTransaccion))
            {
                throw new ArgumentException("el tipo de la Transaccion no puede ser nulo o vacio.");
            }
            if (string.IsNullOrEmpty(objTransaccion.Descripcion))
            {
                throw new ArgumentException("La descripcion de la Transaccion no puede ser nula o vacia.");
            }
            if (objTransaccion.Monto <= 0)
            {
                throw new ArgumentException("el monto no puede ser menor o igual a cero");
            }
            int? TransaccionId = 0;

            TransaccionDSTableAdapters.TransaccionTableAdapter adapter =
                new TransaccionDSTableAdapters.TransaccionTableAdapter();

            adapter.Insert(ref TransaccionId, objTransaccion.ServicioId, objTransaccion.TipoTransaccion, objTransaccion.FechaTransaccion, objTransaccion.Descripcion, objTransaccion.Monto);

            if (TransaccionId == null)
            {
                throw new Exception("La sentencia SQL se ejecuto correctamente pero no se genero la llave primaria");
            }

            return TransaccionId.Value;
        }

        public static void UpdateTransaccion(Transaccion objTransaccion)
        {
            if (objTransaccion == null)
            {
                throw new ArgumentException("la Transaccion no puede ser nula.");
            }
            if (objTransaccion.ServicioId <= 0)
            {
                throw new ArgumentException("el servicioid no puede ser menor o igual a cero");
            }
            if (string.IsNullOrEmpty(objTransaccion.TipoTransaccion))
            {
                throw new ArgumentException("el tipo de la Transaccion no puede ser nulo o vacio.");
            }
            if (objTransaccion.FechaTransaccion == null)
            {
                throw new ArgumentException("la fecha de Transaccion no puede ser nula");
            }
            if (string.IsNullOrEmpty(objTransaccion.Descripcion))
            {
                throw new ArgumentException("La descripcion de la Transaccion no puede ser nula o vacia.");
            }
            if (objTransaccion.Monto <= 0)
            {
                throw new ArgumentException("el monto no puede ser menor o igual a cero");
            }
            TransaccionDSTableAdapters.TransaccionTableAdapter adpater =
                   new TransaccionDSTableAdapters.TransaccionTableAdapter();

            adpater.Update(objTransaccion.TransaccionId, objTransaccion.ServicioId, objTransaccion.TipoTransaccion, objTransaccion.FechaTransaccion, objTransaccion.Descripcion, objTransaccion.Monto);

        }

        public static void DeleteTransaccion(int TransaccionId)
        {
            if (TransaccionId <= 0)
            {
                throw new ArgumentException("TransaccionId no puede ser menor o igual que cero.");
            }
            TransaccionDSTableAdapters.TransaccionTableAdapter adpater =
                  new TransaccionDSTableAdapters.TransaccionTableAdapter();

            adpater.Delete(TransaccionId);
        }

        public static Transaccion GetTransaccionById(int TransaccionId, int ServicioId)
        {
            if (TransaccionId <= 0)
            {
                throw new ArgumentException("TransaccionId no puede ser menor o igual que cero.");
            }

            TransaccionDSTableAdapters.TransaccionTableAdapter adpater =
                new TransaccionDSTableAdapters.TransaccionTableAdapter();

            TransaccionDS.TransaccionDataTable tabla =
                adpater.GetTransaccionById(TransaccionId, ServicioId);

            if (tabla == null || tabla.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener la Transaccion " + TransaccionId + " de la base de datos");
            }
            return ConstruirTransaccion(tabla[0], ServicioId);
        }

        public static List<Transaccion> GetTransaccionBySearch(string parametro, string servicioId)
        {
            int aux = Convert.ToInt32(servicioId);
            List<Transaccion> lista = new List<Transaccion>();

            TransaccionDSTableAdapters.TransaccionTableAdapter adpater =
                  new TransaccionDSTableAdapters.TransaccionTableAdapter();

            TransaccionDS.TransaccionDataTable tabla =
                adpater.GetTransaccionBySearch(parametro, aux);

            if (tabla == null)
            {
                throw new Exception("No se pudo obtener resultados de la busqueda con el parametro " +
                    parametro +
                    " de la base de datos");
            }

            foreach (TransaccionDS.TransaccionRow row in tabla)
            {
                Transaccion obj = ConstruirTransaccion(row, aux);
                if (obj != null)
                    lista.Add(obj);
            }
            return lista;
        }

        public static Transaccion ConstruirTransaccion(TransaccionDS.TransaccionRow row, int servicioId)
        {
            if (row == null)
                return null;
            return new Transaccion(row.transaccionId, servicioId, row.tipoTransaccion, row.fechaTransaccion, row.descripcion, row.montoTransaccion, row.RowNumber);

        }
    }
}
